﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/*
 场景题 5：服务定位器
 场景描述：
    你的应用程序需要一个服务定位器，用于在运行时动态获取不同的服务实例。为了确保服务定位器本身只有一个实例，并且能够提供全局访问，你决定使用单例模式实现服务定位器。
 练习要求：
     实现一个单例模式的服务定位器类。
     提供方法来注册和获取服务实例。
     确保服务定位器在整个应用程序中只有一个实例。
 */
namespace CS_BEGINNER_TO_PROFICIENT.DesignPatterns.CreationMode.SingletonPattern.Practice
{
    public class ServiceLocator
    {
        private static readonly Lazy<ServiceLocator> _instance = new Lazy<ServiceLocator>(() => new ServiceLocator());
        private readonly Dictionary<Type, object> _services;

        private ServiceLocator()
        {
            _services = new Dictionary<Type, object>();
        }

        public static ServiceLocator Instancec => _instance.Value;

        public void RegisterService<T>(T service)
        {
            _services[typeof(T)] = service;
        }

        public T GetService<T>()
        {
            if (_services.TryGetValue(typeof(T), out var service))
            {
                return (T)service;
            }

            throw new InvalidOperationException($"Service of type {typeof(T)} is not registered.");
        }
    }
}
